﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MySql.Data;
using MySql.Data.MySqlClient;
using System.Data;
using System.Configuration;
using System.ComponentModel;
using System.Net.Mail;
using System.Net;

namespace Servidor
{
    public class Servidor
    {
        Conexion conexion;

        public Servidor(int tipo, string pNombreBaseDatos)
        {
            conexion = new Conexion(tipo, pNombreBaseDatos);
        }

        public bool AbrirConexion()
        {
            return conexion.AbrirConexion();
        }

        public bool CerrarConexion()
        {
            return conexion.CerrarConexion();
        }

        public List<string> Consultar(int tipo)
        {
            string consulta = "";

            switch (tipo)
            {
                case 1:
                    consulta = "CONSULTAR_EMPRESA";
                    break;
                case 2:
                    consulta = "CONSULTAR_PAIS";
                    break;
                case 3:
                    consulta = "OBTENER_BODEGAS";
                    break;
                case 4:
                    consulta = "OBTENER_ARTICULOS";
                    break;
                case 5:
                    consulta = "OBTENER_PROVEEDORES";
                    break;
                case 6:
                    consulta = "OBTENER_SOCIONEGOCIO";
                    break;
                case 7:
                    consulta = "OBTENER_CLIENTES";
                    break;
            }

            MySqlCommand cmd = new MySqlCommand(consulta, conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection.Open();
            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            List<string> lista = new List<string>();
            while (dr.Read())
            {
                lista.Add(dr.GetString(0));

            }
            dr.Close();
            return lista;
        }

        public List<String> Consulta1(String cliente, String articulo)
        {
            MySqlCommand cmd = new MySqlCommand("VENTAS_ARTICULOCLIENTE", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new MySqlParameter("ARTICULO", articulo));
            cmd.Parameters.Add(new MySqlParameter("CLIENTE", cliente));
            cmd.Connection.Open();
            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            List<string> lista = new List<string>();
            while (dr.Read())
            {
                lista.Add(dr.GetString(0) + ";" + dr.GetString(1));
            }
            dr.Close();
            return lista;
        }

        public List<String> Consulta2(String cliente, String articulo)
        {
            List<string> lista = new List<string>();
            MySqlCommand cmd = new MySqlCommand("ULTIMAVENTA_ARTICULOCLIENTE", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new MySqlParameter("ARTICULO", articulo));
            cmd.Parameters.Add(new MySqlParameter("CLIENTE", cliente));
            cmd.Connection.Open();
            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            
            while (dr.Read())
            {
                lista.Add(dr.GetString(0));
            }
            dr.Close();

            MySqlCommand cmd2 = new MySqlCommand("VENDIDO_ARTICULOCLIENTE", conexion.connection);
            cmd2.CommandType = CommandType.StoredProcedure;
            cmd2.Parameters.Add(new MySqlParameter("ARTICULO", articulo));
            cmd2.Parameters.Add(new MySqlParameter("CLIENTE", cliente));
            cmd2.Connection.Open();
            MySqlDataReader dr2 = cmd2.ExecuteReader(CommandBehavior.CloseConnection);

            while (dr2.Read())
            {
                lista.Add(dr2.GetString(0));
            }
            dr2.Close();

            MySqlCommand cmd3 = new MySqlCommand("VENTAANUAL_ARTICULOCLIENTE", conexion.connection);
            cmd3.CommandType = CommandType.StoredProcedure;
            cmd3.Parameters.Add(new MySqlParameter("ARTICULO", articulo));
            cmd3.Parameters.Add(new MySqlParameter("CLIENTE", cliente));
            cmd3.Connection.Open();
            MySqlDataReader dr3 = cmd3.ExecuteReader(CommandBehavior.CloseConnection);

            while (dr3.Read())
            {
                lista.Add(dr3.GetString(0));
            }
            dr3.Close();

            MySqlCommand cmd4 = new MySqlCommand("PROMEDIO_FACTURA", conexion.connection);
            cmd4.CommandType = CommandType.StoredProcedure;
            cmd4.Parameters.Add(new MySqlParameter("CLIENTE", cliente));
            cmd4.Connection.Open();
            MySqlDataReader dr4 = cmd4.ExecuteReader(CommandBehavior.CloseConnection);

            while (dr4.Read())
            {
                lista.Add(dr4.GetString(0));
            }
            dr4.Close();

            MySqlCommand cmd5 = new MySqlCommand("INVENTARIO_ARTICULO", conexion.connection);
            cmd5.CommandType = CommandType.StoredProcedure;
            cmd5.Parameters.Add(new MySqlParameter("ARTICULO", articulo));
            cmd5.Connection.Open();
            MySqlDataReader dr5 = cmd5.ExecuteReader(CommandBehavior.CloseConnection);

            while (dr5.Read())
            {
                lista.Add(dr5.GetString(0) + ";" + dr5.GetString(1) + ";" + dr5.GetString(2) + ";" + dr5.GetString(3));
            }
            dr5.Close();

            return lista;
        }

        public List<String> Consulta3(String cliente)
        {
            List<string> lista = new List<string>();
            MySqlCommand cmd = new MySqlCommand("CREDITO_SALDO_CLIENTE", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new MySqlParameter("CLIENTE", cliente));
            cmd.Connection.Open();
            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            while (dr.Read())
            {
                lista.Add(dr.GetString(0)+";"+dr.GetString(1));
            }
            dr.Close();
            return lista;
        }

        public void Crear_Empresa(String nombre, String cedula, String logo, String pais)
        {
            MySqlCommand cmd = new MySqlCommand("CREAR_EMPRESA", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new MySqlParameter("NOMBRE", nombre));
            cmd.Parameters.Add(new MySqlParameter("CEDULA", cedula));
            cmd.Parameters.Add(new MySqlParameter("LOGO", logo));
            cmd.Parameters.Add(new MySqlParameter("NOMPAIS", pais));

            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
            cmd.Connection.Close();

            conexion.crearNuevaBaseDatos(nombre);

        }

        public void Crear_Asiento(string fecha, string fechaDocumento, string ref1, string ref2, string tipoAsiento)
        {
            //Crear el nuevo asiento
            MySqlCommand cmd = new MySqlCommand("CREAR_ASIENTO", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;

            DateTime fechaAs = new DateTime();
            fechaAs = DateTime.ParseExact(fecha, "dd/MM/yyyy", null);
            DateTime fechaDocs = new DateTime();
            fechaDocs = DateTime.ParseExact(fechaDocumento, "dd/MM/yyyy", null);

            cmd.Parameters.Add(new MySqlParameter("FECHA_CONTABILIZACION", fechaAs));
            cmd.Parameters.Add(new MySqlParameter("FECHA_DOCUMENTO", fechaDocs));
            cmd.Parameters.Add(new MySqlParameter("REFERENCIA1", ref1));
            cmd.Parameters.Add(new MySqlParameter("REFERENCIA2", ref2));
            cmd.Parameters.Add(new MySqlParameter("TIPOASIENTO", tipoAsiento));

            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
            cmd.Connection.Close();
        }

        public void Asociar_AsientoXCuenta(string codCuenta, int debe, string monto)
        {

            //Asociar el nuevo asiento a la cuenta indicada
            double nuevoMonto = Convert.ToSingle(monto);
            MySqlCommand cmd = new MySqlCommand("ASOCIAR_CUENTA_ASIENTO", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new MySqlParameter("CODIGO_CUENTA", codCuenta));
            cmd.Parameters.Add(new MySqlParameter("DEBE", debe)); //Va al debe o al haber
            cmd.Parameters.Add(new MySqlParameter("MONTO", nuevoMonto));

            //Verificar si el monto debe ser negativo o positivo
            switch (codCuenta.Split('-')[0])
            {
                case "1":
                case "5":
                case "6":
                case "8":
                    if (debe == 0)
                        nuevoMonto = nuevoMonto * -1;
                    break;
                default:
                    if (debe == 1)
                        nuevoMonto = nuevoMonto * -1;
                    break;
            }
            cmd.Parameters.Add(new MySqlParameter("ACTUALIZAR", nuevoMonto));
            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
            cmd.Connection.Close();

        }

        public void Crear_Cuenta(String codigo, String nombre, String nombre_extranjero, int titulo)
        {
            MySqlCommand cmd = new MySqlCommand("CREAR_CUENTA", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new MySqlParameter("CODIGO", codigo));
            cmd.Parameters.Add(new MySqlParameter("NOMBRE", nombre));
            cmd.Parameters.Add(new MySqlParameter("NOMBRE_EXTRANJERO", nombre_extranjero));
            cmd.Parameters.Add(new MySqlParameter("TITULO", titulo));

            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
            cmd.Connection.Close();
        }

        public void Crear_Articulo(String socio_negocio, String nombre, String codigo, String unidad_medida, String descripcion, String imagen)
        {
            MySqlCommand cmd = new MySqlCommand("CREAR_ARTICULO", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new MySqlParameter("SOCIO_NEGOCIO", socio_negocio));
            cmd.Parameters.Add(new MySqlParameter("CODIGO", codigo));
            cmd.Parameters.Add(new MySqlParameter("DESCRIPCION", descripcion));
            cmd.Parameters.Add(new MySqlParameter("IMAGEN", imagen));
            cmd.Parameters.Add(new MySqlParameter("UNIDAD_MEDIDA", unidad_medida));
            cmd.Parameters.Add(new MySqlParameter("NOMBRE", nombre));

            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
            cmd.Connection.Close();
        }

        public string Ver_Articulo(string nombre_articulo)
        {
            MySqlCommand cmd = new MySqlCommand("MOSTRAR_ARTICULO", conexion.connection);
            string resultado = null;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new MySqlParameter("pNombre", nombre_articulo));
            cmd.Connection.Open();
            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            if (dr.Read())
            {
                resultado = dr.GetString(0) + ";" + dr.GetString(1) + ";" + dr.GetString(2) + ";" + dr.GetString(3) + ";" + dr.GetString(4) + ";" + dr.GetString(5);
            }
            dr.Close();
            return resultado;
        }

        public void Crear_Bodega(String codigo, String nombre)
        {
            MySqlCommand cmd = new MySqlCommand("CREAR_BODEGA", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new MySqlParameter("PCODIGO", codigo));
            cmd.Parameters.Add(new MySqlParameter("PNOMBRE", nombre));

            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
            cmd.Connection.Close();
        }

        public bool Autenticar_Usuario(String nombre, String contraseña, String empresa)
        {
            MySqlCommand cmd = new MySqlCommand("AUTENTICAR", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection.Open();

            cmd.Parameters.Add(new MySqlParameter("NOMBRE", nombre));
            cmd.Parameters.Add(new MySqlParameter("PASSWORD", contraseña));
            cmd.Parameters.Add(new MySqlParameter("EMPRESA", empresa));

            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            List<string> lista = new List<string>();
            while (dr.Read())
            {
                lista.Add(dr.GetString(0));

            }
            dr.Close();

            int NumeroElementos = lista.Count;

            if (NumeroElementos > 0)
                return true;
            else
                return false;
        }

        public bool Autenticar_Proveedor(String nombre, String contraseña)
        {
            MySqlCommand cmd = new MySqlCommand("AUTENTICAR_PROVEEDOR", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection.Open();

            cmd.Parameters.Add(new MySqlParameter("SOCIO", nombre));
            cmd.Parameters.Add(new MySqlParameter("PASS",contraseña));

            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            List<string> lista = new List<string>();
            while (dr.Read())
            {
                lista.Add(dr.GetString(0));

            }
            dr.Close();

            int NumeroElementos = lista.Count;

            if (NumeroElementos > 0)
                return true;
            else
                return false;
        }

        public float Obtener_Ingresos_Operativos()
        {
            float ingresos;
            MySqlCommand proc_obtener_ingresos = new MySqlCommand("OBTENER_INGRESOS_OPERATIVOS", conexion.connection);
            proc_obtener_ingresos.CommandType = CommandType.StoredProcedure;
            proc_obtener_ingresos.Connection.Open();

            MySqlDataReader dr = proc_obtener_ingresos.ExecuteReader(CommandBehavior.CloseConnection);

            if (dr.Read())
            {
                ingresos = dr.GetFloat(0);
                dr.Close();
                return ingresos;
            }

            return 0;
        }

        public List<String> Obtener_Cuentas(Boolean titulo)
        {
            MySqlCommand cmd = new MySqlCommand("OBTENER_CUENTAS", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new MySqlParameter("TITULO", titulo));
            cmd.Connection.Open();
            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            List<string> lista = new List<string>();
            while (dr.Read())
            {
                lista.Add(dr.GetString(0) + ";" + dr.GetString(1) + ";" + dr.GetString(3) + ";" + dr.GetString(4));
            }
            dr.Close();
            return lista;
        }

        public List<String> Obtener_Articulo(String socionegocio)
        {
            MySqlCommand cmd = new MySqlCommand("GENERAR_TOP", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new MySqlParameter("PROVEEDOR", socionegocio));
            cmd.Connection.Open();
            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            List<string> lista = new List<string>();
            while (dr.Read())
            {
                lista.Add(dr.GetString(0) + ";" + dr.GetString(1) + ";" + dr.GetString(2));
            }
            dr.Close();
            return lista;
        }

        public float Obtener_Gastos_Operativos()
        {
            float gastos;
            MySqlCommand proc_obtener_gastos = new MySqlCommand("OBTENER_GASTOS_OPERATIVOS", conexion.connection);
            proc_obtener_gastos.CommandType = CommandType.StoredProcedure;
            proc_obtener_gastos.Connection.Open();



            MySqlDataReader dr = proc_obtener_gastos.ExecuteReader(CommandBehavior.CloseConnection);
            if (dr.Read())
            {
                gastos = dr.GetFloat(0);
                dr.Close();
                return gastos;
            }

            return 0;
        }

        public void Actualizar_Saldo(float monto, String codigo_cuenta)
        {
            MySqlCommand proc_actualizar = new MySqlCommand("ACTUALIZAR_SALDO", conexion.connection);
            proc_actualizar.CommandType = CommandType.StoredProcedure;

            proc_actualizar.Parameters.Add(new MySqlParameter("MONTO", monto));
            proc_actualizar.Parameters.Add(new MySqlParameter("CODIGO_CUENTA", codigo_cuenta));

            proc_actualizar.Connection.Open();
            proc_actualizar.ExecuteNonQuery();
            proc_actualizar.Connection.Close();
        }

        public List<string> Obtener_Asientos()
        {
            List<string> asientos = new List<string>();
            MySqlCommand proc_asientos = new MySqlCommand("OBTENER_ASIENTOS", conexion.connection);
            proc_asientos.CommandType = CommandType.StoredProcedure;
            proc_asientos.Connection.Open();
            MySqlDataReader dr = proc_asientos.ExecuteReader(CommandBehavior.CloseConnection);
            List<string> lista = new List<string>();
            while (dr.Read())
            {
                lista.Add(dr.GetString(0) + ";" + dr.GetString(1) + ";" + dr.GetDateTime(2).ToShortDateString());
            }
            dr.Close();
            return lista;
        }

        public List<string> Obtener_Info_Asiento(int id)
        {
            MySqlCommand proc_asientos = new MySqlCommand("OBTENER_INFO_ASIENTO", conexion.connection);
            proc_asientos.CommandType = CommandType.StoredProcedure;
            proc_asientos.Parameters.Add(new MySqlParameter("ID_ASIENTO", id));
            proc_asientos.Connection.Open();
            MySqlDataReader dr = proc_asientos.ExecuteReader(CommandBehavior.CloseConnection);
            List<string> lista = new List<string>();
            while (dr.Read())
            {
                lista.Add(dr.GetString(0) + ";" + dr.GetString(1) + ";" + dr.GetString(2) + ";" + dr.GetString(3) + ";" + dr.GetString(4));
            }
            dr.Close();
            return lista;
        }

        public void Establecer_Saldo(float monto, String codigo_cuenta)
        {
            MySqlCommand proc_modificar = new MySqlCommand("MODIFICAR_SALDO", conexion.connection);
            proc_modificar.CommandType = CommandType.StoredProcedure;

            proc_modificar.Parameters.Add(new MySqlParameter("MONTO", monto));
            proc_modificar.Parameters.Add(new MySqlParameter("CODIGO_CUENTA", codigo_cuenta));

            proc_modificar.Connection.Open();
            proc_modificar.ExecuteNonQuery();
            proc_modificar.Connection.Close();
        }

        public void Crear_Socio_Negocio(String nombre, String email, float max_credito, int proveedor, String cuenta, String ctaBco)
        {
            MySqlCommand proc_modificar = new MySqlCommand("CREAR_SOCIO_NEGOCIO", conexion.connection);
            proc_modificar.CommandType = CommandType.StoredProcedure;

            proc_modificar.Parameters.Add(new MySqlParameter("CODIGO", cuenta));
            proc_modificar.Parameters.Add(new MySqlParameter("NOMBRE", nombre));
            proc_modificar.Parameters.Add(new MySqlParameter("EMAIL", email));
            proc_modificar.Parameters.Add(new MySqlParameter("PROVEEDOR", proveedor));
            proc_modificar.Parameters.Add(new MySqlParameter("MAXIMO_CREDITO", max_credito));
            proc_modificar.Parameters.Add(new MySqlParameter("CUENTA", ctaBco));

            proc_modificar.Connection.Open();
            proc_modificar.ExecuteNonQuery();
            proc_modificar.Connection.Close();
        }

        public string Obtener_Info_Empresa(string NombreEmpresa)
        {
            MySqlCommand cmd = new MySqlCommand("OBTENER_EMPRESA", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new MySqlParameter("pNombre", NombreEmpresa));
            cmd.Connection.Open();

            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            dr.Read();
            String resultado = dr.GetString(0) + ";" + dr.GetString(1) + ";" + dr.GetString(2);

            dr.Close();
            return resultado;
        }

        public float Obtener_Saldo_SocioNegocio(String socio)
        {
            MySqlCommand cmd = new MySqlCommand("OBTENER_SALDOXSOCIO", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new MySqlParameter("SOCIO", socio));
            cmd.Connection.Open();
            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            float saldo = 0;
            if (dr.Read())
            {
                saldo = dr.GetFloat(0);
            }
            dr.Close();
            return saldo;
        }

        public List<string> Obtener_Articulos(Boolean articulo, String nombre)
        {
            MySqlCommand proc_articulos = new MySqlCommand("ARTICULOXBODEGAS", conexion.connection);
            proc_articulos.CommandType = CommandType.StoredProcedure;
            proc_articulos.Parameters.Add(new MySqlParameter("NOMBRE", nombre));
            proc_articulos.Parameters.Add(new MySqlParameter("ARTICULO", articulo));
            proc_articulos.Connection.Open();

            MySqlDataReader dr = proc_articulos.ExecuteReader(CommandBehavior.CloseConnection);
            List<string> lista = new List<string>();
            while (dr.Read())
            {
                String list = dr.GetString(0);
                for (int i = 1; i < 18; i++)
                {
                    if (!dr.IsDBNull(i))
                        list = list + ";" + dr.GetString(i);
                }
                lista.Add(list);
            }
            dr.Close();
            return lista;
        }

        public string Hacer_Cierre(String ctaIR, String ctaDividendos, String utilidades, float dividendos, float impuesta_renta, String nombre_empresa)
        {
            string respuesta = "";

            float IngresosOperativos = Obtener_Ingresos_Operativos();
            float GastosOperativos = Obtener_Gastos_Operativos();

            float UtilidadBruta = IngresosOperativos - GastosOperativos;
            respuesta += UtilidadBruta;

            float ImpuestoRenta = UtilidadBruta * impuesta_renta;
            Actualizar_Saldo(ImpuestoRenta, ctaIR);
            respuesta += ";" + ImpuestoRenta;

            float UtilidadNeta = UtilidadBruta - ImpuestoRenta;
            respuesta += ";" + UtilidadNeta;

            float Dividendos = UtilidadNeta * dividendos;
            Actualizar_Saldo(Dividendos, ctaDividendos);
            respuesta += ";" + Dividendos;

            float UtilidadRetenida = UtilidadNeta - Dividendos;
            Actualizar_Saldo(UtilidadRetenida, utilidades);
            respuesta += ";" + UtilidadRetenida;

            return respuesta;
        }

        public void Operacion_Inventario(int tipo, String codigo_bodega, String nombre_articulo, float cantidad)
        {
            String cmd = "";
            switch (tipo)
            {
                case 1: cmd = "COLOCAR_ORDEN_COMPRA"; break;
                case 2: cmd = "ENTREGA_PEDIDO"; break;
                case 3: cmd = "RECIBIR_MERCANCIA"; break;
                case 4: cmd = "RECIBIR_PEDIDO"; break;
            }
            MySqlCommand proc_operacion = new MySqlCommand(cmd, conexion.connection);
            proc_operacion.CommandType = CommandType.StoredProcedure;

            proc_operacion.Parameters.Add(new MySqlParameter("CODIGO_BODEGA", codigo_bodega));
            proc_operacion.Parameters.Add(new MySqlParameter("NOMBRE_ARTICULO", nombre_articulo));
            proc_operacion.Parameters.Add(new MySqlParameter("CANTIDAD_UNIDADES", cantidad));

            proc_operacion.Connection.Open();
            proc_operacion.ExecuteNonQuery();
            proc_operacion.Connection.Close();
        }

        public void Asociar_Articulo_Inventario(String codigo_bodega, String nombre_articulo, String inventario, String costo_ventas, String ventas, String compras, int mxu, int mnu)
        {
            MySqlCommand proc_asociar = new MySqlCommand("ASOCIAR_ARTICULO_BODEGA", conexion.connection);
            proc_asociar.CommandType = CommandType.StoredProcedure;

            proc_asociar.Parameters.Add(new MySqlParameter("CODIGO_BODEGA", codigo_bodega));
            proc_asociar.Parameters.Add(new MySqlParameter("NOMBRE_ARTICULO", nombre_articulo));
            proc_asociar.Parameters.Add(new MySqlParameter("CODIGO_INVENTARIO", inventario));
            proc_asociar.Parameters.Add(new MySqlParameter("CODIGO_COSTO_VENTAS", costo_ventas));
            proc_asociar.Parameters.Add(new MySqlParameter("CODIGO_VENTAS", ventas));
            proc_asociar.Parameters.Add(new MySqlParameter("CODIGO_COMPRAS", compras));
            proc_asociar.Parameters.Add(new MySqlParameter("MAXIMO_UNIDAD", mxu));
            proc_asociar.Parameters.Add(new MySqlParameter("MINIMO_UNIDAD", mnu));

            proc_asociar.Connection.Open();
            proc_asociar.ExecuteNonQuery();
            proc_asociar.Connection.Close();
        }

        public String Generar_CodigoDocumento(String ptipo_documento)
        {
            MySqlCommand cmd = new MySqlCommand("OBTENER_ULTIMOIDDOCUMENTO", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection.Open();

            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            String ID_DOCUMENTO = "";
            while (dr.Read())
            {
                try
                {
                    ID_DOCUMENTO = dr.GetString(0);
                }
                catch
                {
                    ID_DOCUMENTO = "1";
                }
            }

            dr.Close();

            String TextoDoc = " ";

            if (ptipo_documento.Equals("Orden de Compra"))
            {
                TextoDoc = "OC";
                // el manejo de la parte de proveedores
                
            }
            else if (ptipo_documento.Equals("Entrada de mercancías"))
            {
                TextoDoc = "EM";
            }
            else if (ptipo_documento.Equals("Factura de proveedores"))
            {
                TextoDoc = "FP";
            }
            else if (ptipo_documento.Equals("Orden de Venta"))
            {
                TextoDoc = "OV";
            }
            else if (ptipo_documento.Equals("Entrega de mercancías"))
            {
                TextoDoc = "ENM";
                
            }
            else if (ptipo_documento.Equals("Factura de clientes"))
            {
                TextoDoc = "FC";
            }
            else if (ptipo_documento.Equals("Entrega de mercancías"))
            {
                TextoDoc = "ENM";
            }
            else if (ptipo_documento.Equals("Factura de Servicios"))
            {
                TextoDoc = "FS";
            }

            return TextoDoc + "-" + ID_DOCUMENTO;
        }

        public void Crear_Documento(String pnombre_socio, String pfecha_contabilizacion, String pfecha_entrega, Double ptotal_antesimpuesto, Double pmonto_impuesto,
        Double ptotal, String pdescripcion, String ptipo_documento, String pref_otrodocumento, Boolean dotacion, String cuenta_dotacion)
        {
            //PREPARA INFORMACION GENERAL DE LA CREACION DEL DOCUMENTO
            string COD_DOC = Generar_CodigoDocumento(ptipo_documento);
            DateTime FECHA_CONTABILIZACION = DateTime.ParseExact(pfecha_contabilizacion, "dd/MM/yyyy", null);
            DateTime FECHA_ENTREGA = DateTime.ParseExact(pfecha_entrega, "dd/MM/yyyy", null);
            MySqlCommand cmd = new MySqlCommand("CREAR_DOCUMENTO", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            
            //CREAR EL REGISTRO GENERAL DEL DOCUMENTO EN LA BASE DE DATOS
            cmd.Parameters.Add(new MySqlParameter("PNOMBRE_SOCIONEGOCIO", pnombre_socio));
            cmd.Parameters.Add(new MySqlParameter("PCODIGO", COD_DOC));
            cmd.Parameters.Add(new MySqlParameter("PFECHA_CONTABILIZACION", FECHA_CONTABILIZACION));
            cmd.Parameters.Add(new MySqlParameter("PFECHA_ENTREGA", FECHA_ENTREGA));
            cmd.Parameters.Add(new MySqlParameter("PTOTAL_ANTESIMPUESTO", ptotal_antesimpuesto));
            cmd.Parameters.Add(new MySqlParameter("PMONTO_IMPUESTO", pmonto_impuesto));
            cmd.Parameters.Add(new MySqlParameter("PTOTAL", ptotal));
            cmd.Parameters.Add(new MySqlParameter("PDESCRIPCION", pdescripcion));
            cmd.Parameters.Add(new MySqlParameter("PTIPO_DOCUMENTO", ptipo_documento));
            cmd.Parameters.Add(new MySqlParameter("PREF_DOCUMENTO", pref_otrodocumento));

            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
            cmd.Connection.Close();

            String TipoAsiento = "";

            #region Entrada mercancías
            if (ptipo_documento.Equals("Entrada de mercancías"))
            {
                TipoAsiento = "EM";
                Crear_Asiento(pfecha_entrega, pfecha_contabilizacion, COD_DOC, "", TipoAsiento);

                //PREPARAR COMANDO PARA INSERTAR UN MOVIMIENTO AL ASIENTO ACTUAL
                MySqlCommand cmd4 = new MySqlCommand("ASOCIAR_CUENTA_ASIENTO", conexion.connection);
                cmd4.CommandType = CommandType.StoredProcedure;
                cmd4.Parameters.Add(new MySqlParameter("CODIGO_CUENTA", cuenta_dotacion.Split(';')[0]));
                cmd4.Parameters.Add(new MySqlParameter("DEBE", false));
                cmd4.Parameters.Add(new MySqlParameter("MONTO", ptotal_antesimpuesto));
                cmd4.Parameters.Add(new MySqlParameter("ACTUALIZAR", (-1*ptotal_antesimpuesto)));

                //INSERTAR EL MOVIMIENTO DE CUENTA EN EL ULTIMO ASIENTO
                cmd4.Connection.Open();
                cmd4.ExecuteNonQuery();
                cmd4.Connection.Close();
            }
            #endregion

            #region Factura proveedor
            else if (ptipo_documento.Equals("Factura de proveedores"))
            {
                TipoAsiento= "FP";
                Crear_Asiento(pfecha_entrega, pfecha_contabilizacion, COD_DOC, "", TipoAsiento);

                //PREPARAR COMANDO PARA INSERTAR UN MOVIMIENTO AL ASIENTO ACTUAL (REGISTRO DE IMPUESTO DE VENTAS)
                MySqlCommand cmd4 = new MySqlCommand("ASOCIAR_CUENTA_ASIENTO", conexion.connection);
                cmd4.CommandType = CommandType.StoredProcedure;
                cmd4.Parameters.Add(new MySqlParameter("CODIGO_CUENTA", "6-4-01")); //CUENTA DE IV
                cmd4.Parameters.Add(new MySqlParameter("DEBE", true));
                cmd4.Parameters.Add(new MySqlParameter("MONTO", pmonto_impuesto));
                cmd4.Parameters.Add(new MySqlParameter("ACTUALIZAR", pmonto_impuesto));

                //INSERTAR EL MOVIMIENTO DE IV EN EL ULTIMO ASIENTO
                cmd4.Connection.Open();
                cmd4.ExecuteNonQuery();
                cmd4.Connection.Close();

                //OBTENER EL CODIGO DE LA CUENTA DEL SOCIO 
                MySqlCommand cmd5 = new MySqlCommand("OBTENER_CUENTASOCIO", conexion.connection);
                cmd5.CommandType = CommandType.StoredProcedure;
                cmd5.Parameters.Add(new MySqlParameter("NOMBRE", pnombre_socio));
                cmd5.Parameters.Add(new MySqlParameter("?CODIGO", MySqlDbType.VarChar));
                cmd5.Parameters["?CODIGO"].Direction = ParameterDirection.Output;
                cmd5.Connection.Open();
                cmd5.ExecuteNonQuery();
                String codigoCuentaProveedor = cmd5.Parameters["?CODIGO"].Value.ToString();
                cmd5.Connection.Close();

                //PREPARAR COMANDO PARA INSERTAR UN MOVIMIENTO AL ASIENTO ACTUAL (CUENTAS POR PAGAR AL PROVEEDOR)
                MySqlCommand cmd3 = new MySqlCommand("ASOCIAR_CUENTA_ASIENTO", conexion.connection);
                cmd3.CommandType = CommandType.StoredProcedure;
                cmd3.Parameters.Add(new MySqlParameter("CODIGO_CUENTA", codigoCuentaProveedor)); //CUENTA DE PROVEEDOR
                cmd3.Parameters.Add(new MySqlParameter("DEBE", false));
                cmd3.Parameters.Add(new MySqlParameter("MONTO", ptotal));
                cmd3.Parameters.Add(new MySqlParameter("ACTUALIZAR", ptotal));

                //INSERTAR EL MOVIMIENTO DE CUENTAS POR PAGAR EN EL ULTIMO ASIENTO
                cmd3.Connection.Open();
                cmd3.ExecuteNonQuery();
                cmd3.Connection.Close();

                if (dotacion)
                {
                    //PREPARAR COMANDO PARA INSERTAR UN MOVIMIENTO AL ASIENTO ACTUAL (DOTACION)
                    MySqlCommand cmd6 = new MySqlCommand("ASOCIAR_CUENTA_ASIENTO", conexion.connection);
                    cmd6.CommandType = CommandType.StoredProcedure;
                    cmd6.Parameters.Add(new MySqlParameter("CODIGO_CUENTA", cuenta_dotacion.Split(';')[0]));
                    cmd6.Parameters.Add(new MySqlParameter("DEBE", true));
                    cmd6.Parameters.Add(new MySqlParameter("MONTO", ptotal_antesimpuesto));
                    cmd6.Parameters.Add(new MySqlParameter("ACTUALIZAR", ptotal_antesimpuesto));

                    //INSERTAR EL MOVIMIENTO DE CUENTAS POR PAGAR EN EL ULTIMO ASIENTO
                    cmd6.Connection.Open();
                    cmd6.ExecuteNonQuery();
                    cmd6.Connection.Close();
                }
            }
            #endregion

            #region Entrega mercancías
            else if (ptipo_documento.Equals("Entrega de mercancías"))
            {
                TipoAsiento = "EE";
                Crear_Asiento(pfecha_entrega, pfecha_contabilizacion, COD_DOC, "", TipoAsiento);
            }
            #endregion

            #region Factura clientes
            else if (ptipo_documento.Equals("Factura de clientes"))
            {
                TipoAsiento = "FC";
                Crear_Asiento(pfecha_entrega, pfecha_contabilizacion, COD_DOC, "", TipoAsiento);

                //PREPARAR COMANDO PARA INSERTAR UN MOVIMIENTO AL ASIENTO ACTUAL (REGISTRO DE IMPUESTO DE VENTAS X PAGAR)
                MySqlCommand cmd4 = new MySqlCommand("ASOCIAR_CUENTA_ASIENTO", conexion.connection);
                cmd4.CommandType = CommandType.StoredProcedure;
                cmd4.Parameters.Add(new MySqlParameter("CODIGO_CUENTA", "2-3-01")); //CUENTA DE IVxPagar
                cmd4.Parameters.Add(new MySqlParameter("DEBE", false));
                cmd4.Parameters.Add(new MySqlParameter("MONTO", pmonto_impuesto));
                cmd4.Parameters.Add(new MySqlParameter("ACTUALIZAR", pmonto_impuesto));

                //INSERTAR EL MOVIMIENTO DE IV EN EL ULTIMO ASIENTO
                cmd4.Connection.Open();
                cmd4.ExecuteNonQuery();
                cmd4.Connection.Close();

                //OBTENER EL CODIGO DE LA CUENTA DEL SOCIO 
                MySqlCommand cmd5 = new MySqlCommand("OBTENER_CUENTASOCIO", conexion.connection);
                cmd5.CommandType = CommandType.StoredProcedure;
                cmd5.Parameters.Add(new MySqlParameter("NOMBRE", pnombre_socio));
                cmd5.Parameters.Add(new MySqlParameter("?CODIGO", MySqlDbType.VarChar));
                cmd5.Parameters["?CODIGO"].Direction = ParameterDirection.Output;
                cmd5.Connection.Open();
                cmd5.ExecuteNonQuery();
                String codigoCuentaCliente = cmd5.Parameters["?CODIGO"].Value.ToString();
                cmd5.Connection.Close();

                //PREPARAR COMANDO PARA INSERTAR UN MOVIMIENTO AL ASIENTO ACTUAL (CUENTAS POR PAGAR AL PROVEEDOR)
                MySqlCommand cmd3 = new MySqlCommand("ASOCIAR_CUENTA_ASIENTO", conexion.connection);
                cmd3.CommandType = CommandType.StoredProcedure;
                cmd3.Parameters.Add(new MySqlParameter("CODIGO_CUENTA", codigoCuentaCliente)); //CUENTA DE PROVEEDOR
                cmd3.Parameters.Add(new MySqlParameter("DEBE", true));
                cmd3.Parameters.Add(new MySqlParameter("MONTO", ptotal));
                cmd3.Parameters.Add(new MySqlParameter("ACTUALIZAR", ptotal));

                //INSERTAR EL MOVIMIENTO DE CUENTAS POR COBRAR EN EL ULTIMO ASIENTO
                cmd3.Connection.Open();
                cmd3.ExecuteNonQuery();
                cmd3.Connection.Close();
            }
            #endregion

            #region Factura servicios
            else if (ptipo_documento.Equals("Factura de Servicios"))
            {
                TipoAsiento = "FS";
            }
            #endregion
        }

        public void Agregar_FilaDocumento(String articulo, String bodega, String _impuesto, int cantidad, Double precio_compra, Double total, 
        Boolean dotacion, String cuenta_dotacion, String tipo_documento, String documento_referencia)
        {
            Double impuesto = Convert.ToDouble(_impuesto.Split(',')[1]) * 0.01;
            //PREPARAR COMANDO PARA INSERTAR LA LINEA DEL DOCUMENTO
            MySqlCommand cmd = new MySqlCommand("AGREGAR_LINEADOCUMENTO", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new MySqlParameter("PARTICULO", articulo));
            cmd.Parameters.Add(new MySqlParameter("PBODEGA", bodega));
            cmd.Parameters.Add(new MySqlParameter("PIMPUESTO", impuesto));
            cmd.Parameters.Add(new MySqlParameter("PCANTIDAD", cantidad));
            cmd.Parameters.Add(new MySqlParameter("PPRECIO_COMPRA", precio_compra));
            cmd.Parameters.Add(new MySqlParameter("PTOTAL", total));
            cmd.Connection.Open();
            
            //INSERTAR LINEA DE DOCUMENTO EN BASE DE DATOS
            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            int idArticuloxBodega = 0;
            
            //RECUPERAR VALOR DE RETORNO (PARA BUSCAR LAS CUENTAS NECESARIAS PARA EL ASIENTO)
            if (dr.Read())
            {
                idArticuloxBodega = dr.GetInt32(0);
            }
            dr.Close();

            #region Orden de compra
            if (tipo_documento.Equals("Orden de Compra"))
            {
                //ACTUALIZACIÓN DE INVENTARIO, NO SE HACE ASIENTO POR SER UNA ORDEN DE COMPRA 
                MySqlCommand cmd2 = new MySqlCommand("OC_INVENTARIO", conexion.connection);
                cmd2.CommandType = CommandType.StoredProcedure;

                cmd2.Parameters.Add(new MySqlParameter("PARTICULOXBODEGA", idArticuloxBodega));
                cmd2.Parameters.Add(new MySqlParameter("PSOLICITADO", cantidad));

                cmd2.Connection.Open();
                cmd2.ExecuteNonQuery();
                cmd2.Connection.Close();
            }
            #endregion

            #region Entrada mercancías
            else if (tipo_documento.Equals("Entrada de mercancías"))
            {
                //ACTUALIZACIÓN DE INVENTARIO
                MySqlCommand cmd3 = new MySqlCommand("ENTRADA_INVENTARIO", conexion.connection);
                cmd3.CommandType = CommandType.StoredProcedure;

                cmd3.Parameters.Add(new MySqlParameter("PARTICULOXBODEGA", idArticuloxBodega));
                cmd3.Parameters.Add(new MySqlParameter("PSTOCK", cantidad));
                cmd3.Parameters.Add(new MySqlParameter("PCOSTOVENTAS", precio_compra));
                cmd3.Parameters.Add(new MySqlParameter("OC", !documento_referencia.Equals("")));

                cmd3.Connection.Open();
                cmd3.ExecuteNonQuery();
                cmd3.Connection.Close();

                //OBTIENE EL CODIGO DE LA CUENTA DE INVENTARIO, A PARTIR DEL ID DE ARTICULOXBODEGA
                MySqlCommand cmd5 = new MySqlCommand("OBTENER_CUENTAINVENTARIO", conexion.connection);
                cmd5.CommandType = CommandType.StoredProcedure;

                cmd5.Parameters.Add(new MySqlParameter("PARTICULOXBODEGA", idArticuloxBodega));
                cmd5.Parameters.Add(new MySqlParameter("?RESULTADO", MySqlDbType.VarChar));
	            cmd5.Parameters["?RESULTADO"].Direction = ParameterDirection.Output;

                cmd5.Connection.Open();
                cmd5.ExecuteNonQuery();

                String codigoCuentaAsiento = cmd5.Parameters["?RESULTADO"].Value.ToString();

                cmd5.Connection.Close();

                //PREPARAR COMANDO PARA INSERTAR UN MOVIMIENTO AL ASIENTO ACTUAL
                MySqlCommand cmd4 = new MySqlCommand("ASOCIAR_CUENTA_ASIENTO", conexion.connection);
                cmd4.CommandType = CommandType.StoredProcedure;
                cmd4.Parameters.Add(new MySqlParameter("CODIGO_CUENTA", codigoCuentaAsiento));
                cmd4.Parameters.Add(new MySqlParameter("DEBE", true));
                cmd4.Parameters.Add(new MySqlParameter("MONTO", cantidad*precio_compra));
                cmd4.Parameters.Add(new MySqlParameter("ACTUALIZAR", cantidad * precio_compra));

                //INSERTAR EL MOVIMIENTO DE CUENTA EN EL ULTIMO ASIENTO
                cmd4.Connection.Open();
                cmd4.ExecuteNonQuery();
                cmd4.Connection.Close();
            }
            #endregion

            #region Factura proveedores
            else if (tipo_documento.Equals("Factura de proveedores") && !dotacion)
            {
                //ACTUALIZACIÓN DE INVENTARIO
                //VALIDACIÓN DE EXISTENCIA DE LA ORDEN DE COMPRA
                MySqlCommand cmd3 = new MySqlCommand("VALIDAR_OC", conexion.connection);
                cmd3.CommandType = CommandType.StoredProcedure;
                
                cmd3.Parameters.Add(new MySqlParameter("CODIGO", documento_referencia));
                cmd3.Parameters.Add(new MySqlParameter("?OC", MySqlDbType.VarChar));

                cmd3.Parameters["?OC"].Direction = ParameterDirection.Output;

                cmd3.Connection.Open();
                cmd3.ExecuteNonQuery();

                Boolean oc = Convert.ToBoolean(cmd3.Parameters["?OC"].Value);

                cmd3.Connection.Close();

                //ACTUALIZACIÓN DEL INVENTARIO DE ACUERDO CON LOS DATOS
                MySqlCommand cmd4 = new MySqlCommand("ENTRADA_INVENTARIO", conexion.connection);
                cmd4.CommandType = CommandType.StoredProcedure;

                cmd4.Parameters.Add(new MySqlParameter("PARTICULOXBODEGA", idArticuloxBodega));
                cmd4.Parameters.Add(new MySqlParameter("PSTOCK", cantidad));
                cmd4.Parameters.Add(new MySqlParameter("PCOSTOVENTAS", precio_compra));
                cmd4.Parameters.Add(new MySqlParameter("OC", !documento_referencia.Equals("")));

                cmd4.Connection.Open();
                cmd4.ExecuteNonQuery();
                cmd4.Connection.Close();
                
                //OBTIENE EL CODIGO DE LA CUENTA DE INVENTARIO, A PARTIR DEL ID DE ARTICULOXBODEGA
                MySqlCommand cmd5 = new MySqlCommand("OBTENER_CUENTAINVENTARIO", conexion.connection);
                cmd5.CommandType = CommandType.StoredProcedure;

                cmd5.Parameters.Add(new MySqlParameter("PARTICULOXBODEGA", idArticuloxBodega));
                cmd5.Parameters.Add(new MySqlParameter("?RESULTADO", MySqlDbType.VarChar));
                cmd5.Parameters["?RESULTADO"].Direction = ParameterDirection.Output;

                cmd5.Connection.Open();
                cmd5.ExecuteNonQuery();

                String codigoCuentaInventario = cmd5.Parameters["?RESULTADO"].Value.ToString();

                cmd5.Connection.Close();

                //PREPARAR COMANDO PARA INSERTAR EL MOVIMIENTO DE LA CUENTA DE INVENTARIOS
                MySqlCommand cmd1 = new MySqlCommand("ASOCIAR_CUENTA_ASIENTO", conexion.connection);
                cmd1.CommandType = CommandType.StoredProcedure;
                cmd1.Parameters.Add(new MySqlParameter("CODIGO_CUENTA", codigoCuentaInventario));
                cmd1.Parameters.Add(new MySqlParameter("DEBE", true));
                cmd1.Parameters.Add(new MySqlParameter("MONTO", cantidad*precio_compra));
                cmd1.Parameters.Add(new MySqlParameter("ACTUALIZAR", cantidad * precio_compra));

                //INSERTAR EL MOVIMIENTO DE CUENTA LA CUENTA DE INVENTARIOS EN EL ASIENTO
                cmd1.Connection.Open();
                cmd1.ExecuteNonQuery();
                cmd1.Connection.Close();
            }
            #endregion

            #region Orden de Venta
            else if (tipo_documento.Equals("Orden de Venta"))
            {
                //ACTUALIZACIÓN DE INVENTARIO, NO SE HACE ASIENTO POR SER UNA ORDEN DE VENTA
                MySqlCommand cmd2 = new MySqlCommand("OV_INVENTARIO", conexion.connection);
                cmd2.CommandType = CommandType.StoredProcedure;

                cmd2.Parameters.Add(new MySqlParameter("PARTICULOXBODEGA", idArticuloxBodega));
                cmd2.Parameters.Add(new MySqlParameter("PCOMPROMETIDO", cantidad));

                cmd2.Connection.Open();
                cmd2.ExecuteNonQuery();
                cmd2.Connection.Close();
            }
            #endregion

            #region Entrega Mercancías
            else if (tipo_documento.Equals("Entrega de mercancías"))
            {
                //ACTUALIZACIÓN DE INVENTARIO
                MySqlCommand cmd3 = new MySqlCommand("SALIDA_INVENTARIO", conexion.connection);
                cmd3.CommandType = CommandType.StoredProcedure;

                cmd3.Parameters.Add(new MySqlParameter("PARTICULOXBODEGA", idArticuloxBodega));
                cmd3.Parameters.Add(new MySqlParameter("PSTOCK", cantidad));
                cmd3.Parameters.Add(new MySqlParameter("OC", !documento_referencia.Equals("")));

                cmd3.Connection.Open();
                cmd3.ExecuteNonQuery();
                cmd3.Connection.Close();

                //OBTIENE EL CODIGO DE LA CUENTA DE INVENTARIO, A PARTIR DEL ID DE ARTICULOXBODEGA
                MySqlCommand cmd5 = new MySqlCommand("OBTENER_CUENTAINVENTARIO", conexion.connection);
                cmd5.CommandType = CommandType.StoredProcedure;

                cmd5.Parameters.Add(new MySqlParameter("PARTICULOXBODEGA", idArticuloxBodega));
                cmd5.Parameters.Add(new MySqlParameter("?RESULTADO", MySqlDbType.VarChar));
                cmd5.Parameters["?RESULTADO"].Direction = ParameterDirection.Output;

                cmd5.Connection.Open();
                cmd5.ExecuteNonQuery();

                String codigoCuentaInventario = cmd5.Parameters["?RESULTADO"].Value.ToString();

                cmd5.Connection.Close();

                //OBTIENE EL CODIGO DE LA CUENTA DE COSTO DE VENTAS, A PARTIR DEL ID DE ARTICULOXBODEGA
                MySqlCommand cmd6 = new MySqlCommand("OBTENER_CUENTACV", conexion.connection);
                cmd6.CommandType = CommandType.StoredProcedure;

                cmd6.Parameters.Add(new MySqlParameter("PARTICULOXBODEGA", idArticuloxBodega));
                cmd6.Parameters.Add(new MySqlParameter("?CODIGO", MySqlDbType.VarChar));
                cmd6.Parameters.Add(new MySqlParameter("?CV", MySqlDbType.Decimal));
                cmd6.Parameters["?CODIGO"].Direction = ParameterDirection.Output;
                cmd6.Parameters["?CV"].Direction = ParameterDirection.Output;

                cmd6.Connection.Open();
                cmd6.ExecuteNonQuery();

                String codigoCuentaCV = cmd6.Parameters["?CODIGO"].Value.ToString();
                float costoVentas = Convert.ToSingle(cmd6.Parameters["?CV"].Value);

                cmd5.Connection.Close();

                //CÁLCULO DEL VALOR DEL MOVIMIENTO
                float movimiento = costoVentas * cantidad;

                //PREPARAR COMANDO PARA INSERTAR EL MOVIMIENTO DE LA CUENTA DE COSTO DE VENTAS
                MySqlCommand cmd4 = new MySqlCommand("ASOCIAR_CUENTA_ASIENTO", conexion.connection);
                cmd4.CommandType = CommandType.StoredProcedure;
                cmd4.Parameters.Add(new MySqlParameter("CODIGO_CUENTA", codigoCuentaCV));
                cmd4.Parameters.Add(new MySqlParameter("DEBE", true));
                cmd4.Parameters.Add(new MySqlParameter("MONTO", movimiento));
                cmd4.Parameters.Add(new MySqlParameter("ACTUALIZAR", movimiento));

                //INSERTAR EL MOVIMIENTO DE CUENTA LA CUENTA DE COSTO DE VENTAS EN EL ASIENTO
                cmd4.Connection.Open();
                cmd4.ExecuteNonQuery();
                cmd4.Connection.Close();

                //PREPARAR COMANDO PARA INSERTAR EL MOVIMIENTO DE LA CUENTA DE INVENTARIOS
                MySqlCommand cmd1 = new MySqlCommand("ASOCIAR_CUENTA_ASIENTO", conexion.connection);
                cmd1.CommandType = CommandType.StoredProcedure;
                cmd1.Parameters.Add(new MySqlParameter("CODIGO_CUENTA", codigoCuentaInventario));
                cmd1.Parameters.Add(new MySqlParameter("DEBE", false));
                cmd1.Parameters.Add(new MySqlParameter("MONTO", movimiento));
                cmd1.Parameters.Add(new MySqlParameter("ACTUALIZAR", (movimiento*-1)));

                //INSERTAR EL MOVIMIENTO DE CUENTA LA CUENTA DE INVENTARIOS EN EL ASIENTO
                cmd1.Connection.Open();
                cmd1.ExecuteNonQuery();
                cmd1.Connection.Close();
            }
            #endregion

            #region Factura clientes
            else if (tipo_documento.Equals("Factura de clientes"))
            {
                //NO SE REALIZA ACTUALIZACIÓN DE INVENTARIO, SE REQUIERE HACER LA SALIDA
                //OBTENER INFORMACIÓN DE LA CUENTA DE VENTAS
                MySqlCommand cmd5 = new MySqlCommand("OBTENER_CUENTAVENTAS", conexion.connection);
                cmd5.CommandType = CommandType.StoredProcedure;

                cmd5.Parameters.Add(new MySqlParameter("PARTICULOXBODEGA", idArticuloxBodega));
                cmd5.Parameters.Add(new MySqlParameter("?RESULTADO", MySqlDbType.VarChar));
                cmd5.Parameters["?RESULTADO"].Direction = ParameterDirection.Output;

                cmd5.Connection.Open();
                cmd5.ExecuteNonQuery();

                String codigoCuentaVenta = cmd5.Parameters["?RESULTADO"].Value.ToString();

                cmd5.Connection.Close();

                //PREPARAR COMANDO PARA INSERTAR EL MOVIMIENTO VENTAS AL ASIENTO ACTUAL
                MySqlCommand cmd4 = new MySqlCommand("ASOCIAR_CUENTA_ASIENTO", conexion.connection);
                cmd4.CommandType = CommandType.StoredProcedure;
                cmd4.Parameters.Add(new MySqlParameter("CODIGO_CUENTA", codigoCuentaVenta));
                cmd4.Parameters.Add(new MySqlParameter("DEBE", false));
                cmd4.Parameters.Add(new MySqlParameter("MONTO", cantidad*precio_compra));
                cmd4.Parameters.Add(new MySqlParameter("ACTUALIZAR", cantidad * precio_compra));

                //INSERTAR EL MOVIMIENTO DE CUENTA EN EL ULTIMO ASIENTO
                cmd4.Connection.Open();
                cmd4.ExecuteNonQuery();
                cmd4.Connection.Close();
            }
            #endregion

            #region Factura Servicios
            else if (tipo_documento.Equals("Factura de Servicios"))
            {
            }
            #endregion

        }

        public List<String> Cargar_Documento(String codigo_documento)
        {
            MySqlCommand cmd = new MySqlCommand("CARGAR_DOCUMENTO", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new MySqlParameter("CODIGO_DOCUMENTO", codigo_documento));
            cmd.Connection.Open();

            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            List<string> lista = new List<string>();
            while (dr.Read())
            {
                String FilaDocumento = dr.GetString(0) + ";" + dr.GetString(1) + ";" + dr.GetString(2) + ";" + dr.GetString(3) + ";" +
                dr.GetString(4) + ";" + dr.GetString(5);
                lista.Add(FilaDocumento);
            }
            dr.Close();
            return lista;
        }

        public List<string> Obtener_Articulos_Bodega()
        {
            MySqlCommand proc_articulos = new MySqlCommand("OBTENER_ARTICULOS_BODEGA", conexion.connection);
            proc_articulos.CommandType = CommandType.StoredProcedure;
            proc_articulos.Connection.Open();

            MySqlDataReader dr = proc_articulos.ExecuteReader(CommandBehavior.CloseConnection);
            List<string> lista = new List<string>();
            while (dr.Read())
            {
                lista.Add(dr.GetString(0) + ";" + dr.GetString(1) + ";" + dr.GetString(2) + ";" + dr.GetString(3) + ";" + dr.GetString(4) + ";" + dr.GetString(5) + ";" + dr.GetString(6) + ";" + dr.GetString(7)
                    + ";" + dr.GetString(8));
            }
            dr.Close();
            return lista;
        }

        public List<String> Obtener_Saldos_Cuentas(bool titulo)
        {
            MySqlCommand proc = new MySqlCommand("OBTENER_CUENTAS_ORDENADAS", conexion.connection);
            proc.CommandType = CommandType.StoredProcedure;
            proc.Parameters.Add(new MySqlParameter("TITULO", titulo));
            proc.Connection.Open();
            MySqlDataReader dr = proc.ExecuteReader(CommandBehavior.CloseConnection);
            List<string> lista = new List<string>();
            while (dr.Read())
            {
                lista.Add(dr.GetString(0) + ";" + dr.GetString(1) + ";" + dr.GetString(2));
            }
            dr.Close();
            return lista;
        }

        public List<String> Obtener_CuentasXCodigo(char codigo)
        {
            MySqlCommand proc = new MySqlCommand("OBTENER_TIPOCUENTAS", conexion.connection);
            proc.CommandType = CommandType.StoredProcedure;
            proc.Parameters.Add(new MySqlParameter("CODIGO", codigo));
            proc.Connection.Open();
            MySqlDataReader dr = proc.ExecuteReader(CommandBehavior.CloseConnection);
            List<string> lista = new List<string>();
            while (dr.Read())
            {
                lista.Add(dr.GetString(0) + ";" + dr.GetString(1) + ";" + dr.GetString(2));
            }
            dr.Close();
            return lista;
        }

        internal string DatabaseToXML()
        {
            MySqlCommand proc_articulos = new MySqlCommand("OBTENER_ARTICULOS_BODEGA_CASO", conexion.connection);
            proc_articulos.CommandType = CommandType.StoredProcedure;
            proc_articulos.Connection.Open();

            MySqlDataReader dr = proc_articulos.ExecuteReader(CommandBehavior.CloseConnection);
            DataSet info = convertDataReaderToDataSet(dr);

            return info.GetXml();
        }

        public List<String> Obtener_Docs_Socio(String socio)
        {
            MySqlCommand proc = new MySqlCommand("OBTENER_DOCS_SOCIO", conexion.connection);
            proc.CommandType = CommandType.StoredProcedure;
            proc.Parameters.Add(new MySqlParameter("SOCIO", socio));
            proc.Connection.Open();
            MySqlDataReader dr = proc.ExecuteReader(CommandBehavior.CloseConnection);
            List<string> lista = new List<string>();
            while (dr.Read())
            {
                lista.Add(dr.GetString(0) + ";" + dr.GetDateTime(1));
            }
            dr.Close();
            return lista;
        }

        public List<String> Obtener_Clientes()
        {
            MySqlCommand proc = new MySqlCommand("OBTENER_CLIENTES", conexion.connection);
            proc.CommandType = CommandType.StoredProcedure;
            proc.Connection.Open();
            MySqlDataReader dr = proc.ExecuteReader(CommandBehavior.CloseConnection);
            List<string> lista = new List<string>();
            while (dr.Read())
            {
                lista.Add(dr.GetString(0));
            }
            dr.Close();
            return lista;
        }

        public bool Revisar_Stock(String articulo)
        {
            MySqlCommand revisar = new MySqlCommand("REVISAR_STOCK", conexion.connection);
            revisar.CommandType = CommandType.StoredProcedure;
            revisar.Parameters.Add(new MySqlParameter("PRODUCTO",articulo));
            revisar.Connection.Open();

            MySqlDataReader dr = revisar.ExecuteReader(CommandBehavior.CloseConnection);

            List<string> lista = new List<string>();
            while (dr.Read())
            {
                lista.Add(dr.GetString(0));

            }
            dr.Close();

            int NumeroElementos = lista.Count;

            if (NumeroElementos > 0)
                return true;
            else
                return false;
        }
        
        public void Enviar_Mail(String proveedor, string mensaje)
        {
            MySqlCommand revisar = new MySqlCommand("EMAIL", conexion.connection);
            revisar.CommandType = CommandType.StoredProcedure;
            revisar.Parameters.Add(new MySqlParameter("PROVEEDOR", proveedor));
            revisar.Connection.Open();

            MySqlDataReader email = revisar.ExecuteReader(CommandBehavior.CloseConnection);
            String mail;
            while (email.Read())
            {
                 mail = email.GetString(0);
           
            var fromAddress = new MailAddress("siaerp2012@gmail.com", "SIA-ERP");
            var toAddress = new MailAddress(mail, proveedor);
            const string fromPassword = "siaerpii2012";
            const string subject = "Orden de Compra";
            string body = mensaje;


            var smtp = new SmtpClient
            {
                Host = "smtp.gmail.com",
                Port = 587,
                EnableSsl = true,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                UseDefaultCredentials = false,
                Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
            };
            using (var message = new MailMessage(fromAddress, toAddress)
            {
                Subject = subject,
                Body = body
            })
            {
                smtp.Send(message);
            }

            }
            email.Close();

        }

        public static DataSet convertDataReaderToDataSet(MySqlDataReader reader)
        {
            DataSet dataSet = new DataSet();
            do
            {
                // Create new data table

                DataTable schemaTable = reader.GetSchemaTable();
                DataTable dataTable = new DataTable();

                if (schemaTable != null)
                {
                    // A query returning records was executed

                    for (int i = 0; i < schemaTable.Rows.Count; i++)
                    {
                        DataRow dataRow = schemaTable.Rows[i];
                        // Create a column name that is unique in the data table
                        string columnName = (string)dataRow["ColumnName"]; //+ "<C" + i + "/>";
                        // Add the column definition to the data table
                        DataColumn column = new DataColumn(columnName, (Type)dataRow["DataType"]);
                        dataTable.Columns.Add(column);
                    }

                    dataSet.Tables.Add(dataTable);

                    // Fill the data table we just created

                    while (reader.Read())
                    {
                        DataRow dataRow = dataTable.NewRow();

                        for (int i = 0; i < reader.FieldCount; i++)
                            dataRow[i] = reader.GetValue(i);

                        dataTable.Rows.Add(dataRow);
                    }
                }
                else
                {
                    // No records were returned

                    DataColumn column = new DataColumn("RowsAffected");
                    dataTable.Columns.Add(column);
                    dataSet.Tables.Add(dataTable);
                    DataRow dataRow = dataTable.NewRow();
                    dataRow[0] = reader.RecordsAffected;
                    dataTable.Rows.Add(dataRow);
                }
            }
            while (reader.NextResult());
            return dataSet;
        }

        public string Obtener_Info_Doc(string codigo)
        {
            String resultado;
            MySqlCommand cmd = new MySqlCommand("OBTENER_INFO_DOC", conexion.connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new MySqlParameter("PCODIGO", codigo));
            cmd.Connection.Open();

            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            dr.Read();
            if (!dr.IsDBNull(7))
            {
                resultado = dr.GetString(0) + ";" + dr.GetString(1) + ";" + dr.GetString(2) + ";" + dr.GetString(3) + ";" + dr.GetString(4) + ";"
                    + dr.GetString(5) + ";" + dr.GetString(6) + ";" + dr.GetString(7);
            }
            else
            {
                resultado = dr.GetString(0) + ";" + dr.GetString(1) + ";" + dr.GetString(2) + ";" + dr.GetString(3) + ";" + dr.GetString(4) + ";"
                    + dr.GetString(5) + ";" + dr.GetString(6) + ";" + "";
            }

            dr.Close();
            return resultado;
        }
    }
}

